#-*- coding: utf-8 -*-

#*************** Sélectionnez votre OS ***************
#from pendu_unix import *
from pendu_win import *

#*************** Choisissez le type d'interface graphique ***************
from pendu_console import *
from pendu_graph import *



"""
Jeu du pendu - basé sur le dico du projet Moby
Mathieu (un peu) et Guillaume, 2013.
"""

import pickle



def ask(prompt):
	"""The same as raw_input() except that it works with Unicode strings"""
	print prompt.strip(),
	return raw_input()

def highscore(filename, top, name, score):
	#On désérialise les highscores
	try:
		f = open(filename, 'r')
		hs = pickle.load(f)
		f.close()
	except IOError: #fichier inexistant
		hs = []
	#On cherche l'endroit où insérer le nouveau score
	if len(hs):
		added = False
		for idx, rec in enumerate(hs):
			if rec[1] < score:
				#on l'insère
				hs.insert(idx, [name, score])
				added = True
				break
		if not added:
			hs.append([name, score])
	else:
		hs.append([name, score])
	#On ne prend que les n premiers highscores
	hs = hs[:10]
	#On affiche le tout...
	print u"Les meilleurs scores"
	for idx, rec in enumerate(hs):
		print idx+1, ":", rec[0], "("+str(rec[1])+")"
	#Et on sauve ça...
	f = open(filename, 'w')
	pickle.dump(hs, f)
	f.close()

def belongs_to_dictionary(dico):
	while 1:
		fichier = open(dico)
		chercher = ask(u"Introduisez le mot à deviner : ").lower()
		for ligne in fichier:
			if ligne.strip() == chercher:
				return chercher
		print u"Le mot n'existe pas dans le dico... Recommencez !"

def caractere(mot, place):
	"""
	>>> print caractere('booh', 1)
	o
	>>> print caractere('a', 1)
	None
	"""
	if (place >= len(mot)) or (place < 0):
		return None
	return mot[place]

def decouvre(mot, motM, letter):
	if len(mot) != len(motM):
		return None
	res = motM
	for i, c in enumerate(mot):
		if letter == c:
			res = res[0:i] + c +res[i+1:]
	return res

def is_letter(s):
	"""
	>>> is_letter('z')
	True
	>>> is_letter('kappa')
	False
	>>> is_letter('')
	False
	>>> is_letter('+')
	False
	"""
	lo = s.lower()
	return len(s)==1 and lo>='a' and lo<='z'

def compute_score(word, remaining, trials_total):
	used = ''
	for c in word:
		if used.find(c) == -1:
			used += c
	return len(used)+ remaining - trials_total



"""
Début du jeu à proprement parler
"""

word = belongs_to_dictionary('words.txt')
cls()
word_m = '*' * len(word)
maxTrials = len(word)+5
trials = maxTrials
used = ''
found = 0
err = 0
msg = 	[
			[1, u"Tricheur, va !"],
			[0.8, u"Même pas mal !"],
			[0.5, u"Déjà cul de jatte..."],
			[0.3, u"Limite..."],
			[0, u"Vous avez perdu ! Lamentable !"]
		]
highscores = 'highscores.txt'
highscores_len = 10

t = 0 #contiendra la tortue... ou pas (si on n'a pas activé Turtle)
graph_init()
while trials: #non nul
	#Affichage des infos
	print "-----"
	print u"Tentatives restantes :", trials
	print u"Mot :", word_m
	print u"Lettres déjà utilisées :", used
	#On demande à l'utilisateur une lettre
	while 1:
		letter = ask(u"Lettre : ")
		if is_letter(letter):
			break
	#Est-ce correct ?
	if word.find(letter)!=-1 and (word_m.find(letter)==-1):
		print u"Bien !"
		found += 1
		word_m = decouvre(word, word_m, letter)
		if word == word_m:
			break
	else:
		#Le joueur s'est trompé, un essai de moins !
		print u"Eh non..."
		"""
		On ajoute la lettre à celles déjà utilisées (on pourrait 
		le faire dans les deux cas, mais ajoutons un peu 
		de difficulté pour le joueur :p)
		On ne l'ajoutera pas si elle s'y trouve déjà...
		"""
		if used.find(letter) == -1:
			used += letter
		err += 1
		graph_draw(err)
		trials -= 1

print "---------------"
ratio = trials/maxTrials
for m in msg:
	if ratio >= m[0]:
		print m[1]
		break
score = compute_score(word, trials, maxTrials-trials+found)
print u"*** Votre score :", score
name = ask(u"*** Votre nom ? ")
print "---------------"
highscore(highscores, highscores_len, name, score)



exit()
if __name__=='__main__':
	import doctest
	v = False #or True
	doctest.testmod(verbose=v)
